/*
 * drop.c
 *
 *  Created on: 2021年5月20日
 *      Author: soliber
 */

#include "drop.h"

static uint16_t added[3]={0},remain[3]={0};
static Drop_Status_Typedef status;


/*
 * 函数名：	HAL_Drop_Start
 *
 * 说明：	开始加入液体
 * 			将打开对应的夹管阀使液体流通
 * 			在数量达到后将自动关闭夹管阀
 * 			该函数不会阻塞，开始后将以中断方式控制
 *
 * 参数：	n，各通道需要加入的液滴数量
 *
 * 返回值：	无
 */
void HAL_Drop_Start(uint16_t n[3])
{

	if((n[0]==0)&&(n[0]==0)&&(n[0]==0))
	{
		return ;
	}

	//开始计数
	added[0]=0;
	added[1]=0;
	added[2]=0;
	remain[0]=n[0];
	remain[1]=n[1];
	remain[2]=n[2];
	status = DROP_BUSY;

	//清中断
	__HAL_GPIO_EXTI_CLEAR_IT(DROP1_Pin+DROP2_Pin+DROP3_Pin);

	//开启夹管阀
	HAL_CLIPVALVE_OPEN((n[0]==0?0:VALVE1)+
			(n[1]==0?0:VALVE2)+
			(n[2]==0?0:VALVE3));
}

/*
 * 函数名：	HAL_Drop_Get_Status
 *
 * 说明：	获取液滴传感器当前工作状态
 *
 * 参数：	无
 *
 * 返回值：	DROP_READY，滴液完成，进入就绪状态
 * 			DROP_BUSY，正在滴液
 */
Drop_Status_Typedef HAL_Drop_Get_Status(void)
{
	return status;
}

/*
 * 函数名：	HAL_Drop_Get_Remain
 *
 * 说明：	获取指定通道的剩余液滴数
 *
 * 参数：	ch，指定的通道编号，0~2
 *
 * 返回值：	已加入液滴数量
 */
uint16_t HAL_Drop_Get_Remain(uint8_t ch)
{
	return remain[ch];
}

/*
 * 函数名：	HAL_Drop_Get_Added
 *
 * 说明：	获取指定通道的已加入液滴数
 *
 * 参数：	ch，指定的通道编号，0~2
 *
 * 返回值：	已加入液滴数量
 */
uint16_t HAL_Drop_Get_Added(uint8_t ch)
{
	return added[ch];
}

/*
 * 函数名：	HAL_Drop_Abort
 *
 * 说明：	终止加入液体，并关闭所有夹管阀
 *
 * 参数：	无
 *
 * 返回值：	无
 */
void HAL_Drop_Abort(void)
{
	HAL_CLIPVALVE_CLOSE(VALVE_ALL);
	status = DROP_READY;
}


/*-----------------------------中断处理---------------------------------*/
/*
 * 函数名：	HAL_Drop_Handler
 *
 * 说明：	液滴检测处理
 * 			请在对应的中断请求处理函数（EXTI15_10_IRQHandler）
 * 			中调用该函数
 * 			液滴低落触发的外部中断将在此处理
 *
 * 参数：	无
 *
 * 返回值：	无
 */
void HAL_Drop_Handler(void)
{
	//仅在工作状态进行处理
	if(status == DROP_BUSY)
	{
		//检测到通道1的1滴液体
		if(__HAL_GPIO_EXTI_GET_IT(DROP1_Pin)!=0x00u)
		{
			__HAL_GPIO_EXTI_CLEAR_IT(DROP1_Pin);
			//还有剩余液体
			if(remain[0])
			{
				//通道1计数
				added[0]++;
				remain[0]--;
				//没有剩余液体
				if(remain[0]==0)
				{
					HAL_CLIPVALVE_CLOSE(VALVE1);
				}
			}
		}
		//检测到通道2的1滴液体
		if(__HAL_GPIO_EXTI_GET_IT(DROP2_Pin)!=0x00u)
		{
			__HAL_GPIO_EXTI_CLEAR_IT(DROP2_Pin);
			//还有剩余液体
			if(remain[1])
			{
				//通道2计数
				added[1]++;
				remain[1]--;
				//没有剩余液体
				if(remain[1]==0)
				{
					HAL_CLIPVALVE_CLOSE(VALVE2);
				}
			}
		}
		//检测到通道3的1滴液体
		if(__HAL_GPIO_EXTI_GET_IT(DROP3_Pin)!=0x00u)
		{
			__HAL_GPIO_EXTI_CLEAR_IT(DROP3_Pin);
			//还有剩余液体
			if(remain[2])
			{
				//通道3计数
				added[2]++;
				remain[2]--;
				//没有剩余液体
				if(remain[2]==0)
				{
					HAL_CLIPVALVE_CLOSE(VALVE3);
				}
			}
		}
		//液体添加完毕
		if((remain[0]==0)&&(remain[1]==0)&&(remain[2]==0))
		{
			HAL_CLIPVALVE_CLOSE(VALVE_ALL);
			status = DROP_READY;
			HAL_Drop_Cplt_Callback(added);
		}
	}
}
/*
 * 函数名：	HAL_Drop_Cplt_Callback
 *
 * 说明：	液体加入完成回调函数
 * 			在加注完所有液体后将调用此函数
 *
 * 参数：	added，3个通道已加入的液滴数量
 *
 * 返回值：	无
 */
__weak void HAL_Drop_Cplt_Callback(uint16_t added[3])
{
	UNUSED(added);
}
